package 第二章数据类型;

/*
	
	关于基本数据类型之间的转换:
		1、转换规则
		
		一、八种数据类型中,除布尔型之外,其他的数据类型都可以相互转换;
		
		二、小容量向大容量转换,成为自动类型转换,容量排序如下
				byte<short<int<long<float<double
					<char<
			任何浮点型都比整数型容量大
			char和short容量相同,但char可以表示更大的正整数
 		
 		三、大容量转换成小容量,称为强制类型转换,需要加强制类型转换符,在运行阶段可能会损失精度,需要谨慎使用
 		
 		四、当整数型字面值没有超出byte、short、char的取值范围时,可以直接赋值给byte、short、char类型的变量
 		
 		五、byte、short、char混合运算时,各自先转换成int类型再做运行

 		六、多种数据类型混合运算,先转换成容量最大的数据类型再做运算


 		Java编译期只考虑语法正确性,不要将运算带入

 */
public class DataType08 {
    public static void main(String[] args) {
        char c = 97;
        System.out.println(c);

        //出现错误，1000超出了byte 的范围
        //byte a = 1000;

        //正确，因为20没有超出byte的范围
        byte a = 20;

        //变量不能重名
        //short a = 1000;

        //正确，因为数值1000没有超出short类型范围
        short b = 1000;

        //正确，因为默认就是int，且没有超出取值范围
        int c1 = 1000;

        //正确，可以自动转换
        long d = c;

        //错误，出现精度丢失问题，大容量向小容量转换会出现问题
        //int e = d;

        //正确，将long强制转换成int类型，且1000没有超出int的取值范围
        int e = (int) d;

        //因为java运算会转成最大类型，而10和3默认为int，运算后的最大类型是int，所以正确
        int f = 10 / 3;

        //声明10为long类型
        long g = 10;

        //错误，多个数值再运算过程中，会转成最大数据类型
        //以下示例最大为long，而h为int，所以精度丢失问题
        //int h = g/3

        //可以强制转换，因为运算结果没有超出int范围
        //int h =(int)g/3;

        //可以采用long类型来接收运算结果
        //long h = g/3;

        //可以转换，因为运算结果没有超出short。


        //错误写法 byte h=(byte)(int)g/3;
        //运算优先级,首先进行 (int)
        //g,将g转换成int类型,在进行(byte)运算,将g转换成byte类型,在和3进行除法运算时,都会转成int类型运算,
        //运算结果结果也为int类型,不符合h的byte类型
        byte h = (byte) ((byte) (int) g / 3);


        //可以转换，因为运算结果没有超出short
        short h1 = (short) (g / 3);
        short i = 10;
        byte j = 5;

        //错误，short和byte运算，首先会转成int运算，所以运算结果为int，int赋值给short会精度损失。
        //short k = i+j;

        //可以强转为short类型
        //short k = （short）（i+j）;

        int k = i + j;

        char l = 'a';
        System.out.println((byte) l);//结果输出97，也就是a的ascii值


        int m = l + 100;
        System.out.println(m);//输出结果为197


        double dd = 10 / 3;    //以int类型做运算
        System.out.println(dd);//3.0

        dd = 10.0 / 3;        //先全部转换成double类型再运算
        System.out.println(dd);//3.3333333333333335
    }
}